#ifndef DIALOGO_H
#define DIALOGO_H

#include <QDialog>
#include <QVBoxLayout>
#include <QDialogButtonBox>
#include <QMessageBox>
#include "aceptable.h"
#include "tablas_global.h"

#define DIALOGO_TIPO_ACEPTAR_CANCELAR 0
#define DIALOGO_TIPO_SALIR            1
#define DIALOGO_TIPO_VENTANA          2

#define DIALOGO_CANCELADO 0
#define DIALOGO_ACEPTADO 1

#define MOSTRAR_ERROR               0
#define MOSTRAR_AVISO               1
#define MOSTRAR_PREGUNTA_ACEPTAR    2
#define MOSTRAR_PREGUNTA            MOSTRAR_PREGUNTA_ACEPTAR
#define MOSTRAR_PREGUNTA_SI_NO      3
#define MOSTRAR_INFORMACION         4

class TABLAS_EXPORT DialogoBase : public QDialog, public Aceptable, public Cancelable
{
    Q_OBJECT
public:
    DialogoBase(QWidget* parent);
    virtual ~DialogoBase();

    virtual void setContenido(QWidget* contenido) = 0;
    virtual void setTitulo(QString titulo) = 0;
    bool aceptado() { return resultado == DIALOGO_ACEPTADO; }

protected slots:
    virtual bool aceptar() = 0;
    virtual bool cancelar() = 0;

protected:
    int resultado;
};

class TABLAS_EXPORT Dialogo : public DialogoBase
{
    Q_OBJECT

public:
    Dialogo(QWidget* parent = NULL, int tipo = DIALOGO_TIPO_ACEPTAR_CANCELAR);
    virtual ~Dialogo();

    void setContenido(QWidget* contenido);
    void setTitulo(QString titulo);

    static bool mostrarMensaje(QWidget* padre, QString mensaje, int tipo);

    void setIdentificador(const QString& identificador) {
        this->identificador = identificador;
    }

protected slots:    
    bool aceptar();
    bool cancelar();

protected:
    void showEvent(QShowEvent* event);
    void hideEvent(QHideEvent* event);

protected:
    QVBoxLayout* verticalLayout;
    QWidget* contenido;
    QDialogButtonBox* buttonBox;
    QString identificador;
};

#endif // DIALOGO_H
